﻿#pragma once

#include <QObject>
#include "component_data.h"


typedef std::function<int(const QByteArray&)> Callback;

class ComponentManager;
class Component : public QObject
{
	Q_OBJECT

public:
	Component(QObject *parent);
	~Component();

	QString GetComponentName();
	ComponentType GetComponentType();
	QString GetComponentErrMsg();


	/***************************************************
	* 初始化接口, 组件加载时调用
	* 返回值判断， 0：表示成功  -1表示失败，程序可以继续， -99表示严重失败，程序停止
	*************************************/
	virtual int Init(const QByteArray& param);

	/***************************************************
	* 组件复位接口
	*
	*************************************/
	virtual bool Reset();

	/****************************************************************************
	 * 功能: 组件状态检查
	 * 传参:
	 * 返回值:
	 ****************************************************************************/
	virtual bool CheckState();

	// 订阅接口，提供给其它组件订阅本组件消息的接口
	virtual bool RegisterSubscriberFunction(int type, Callback callback) { return false; }


	// 命令执行接口
	virtual bool ExcuteCmd(int cmd, const QByteArray& input, QByteArray& output) { return false; }

	virtual void* GetPoint(const QString& id) { return nullptr; }
protected:
	// 组件初始化处理函数
	virtual int ComponentInit(const QByteArray& param) = 0;
	/*自检接口*/
	virtual bool ComponentCheckSelfState() = 0;
	/*复位接口*/
	virtual bool ComponentSelfReset() = 0;
/****************************************************************************
* 功能: 生成错误信息，发布系统停止消息
* 传参: str: 错误信息描述
* 返回值:
****************************************************************************/
	virtual  void SetErrmsg(const QString& str, bool send = true);

	virtual void SetWarningmsg(const QString& str);

signals:
	void PublishSystemEvent(int type, int eventid);
	void PublishWarningEvent(int type, const QString& msg);
public slots:
	/*系统状态响应接口*/
	virtual void ResponseSystemState(int state) {}

protected:
	QString m_name{};
	ComponentType m_type = ComponentType::component_max;
	QString m_errmsg{};
	ComponentManager* m_ob = nullptr;
};
